package main

import (
	"container/heap"
	"fmt"
)

// 优先级队列中的元素
type Item struct {
	value    string //元素的值
	priority int    //元素的优先级
}

// 优先级队列
type PriorityQueue []*Item

// 队列的长度
func (pq PriorityQueue) Len() int {
	return len(pq)
}

// 判断索引为i的元素是否小于索引为j的元素
func (pq PriorityQueue) Less(i, j int) bool {
	return pq[i].priority < pq[j].priority
}

// 交换队列中的元素
func (pq PriorityQueue) Swap(i, j int) {
	pq[i], pq[j] = pq[j], pq[i]
}

func (pq *PriorityQueue) Push(x interface{}) {
	item := x.(*Item)
	*pq = append(*pq, item)
}

// 移除并返回队列中最小优先级元素
func (pq *PriorityQueue) Pop() interface{} {
	old := *pq
	n := len(old)
	item := old[n-1]
	*pq = old[0 : n-1]
	return item
}

func (pq *PriorityQueue) Enqueue(value string, priority int) {
	heap.Push(pq, &Item{
		value:    value,
		priority: priority,
	})
}

func (pq *PriorityQueue) Dequeue() string {
	Item := heap.Pop(pq).(*Item)
	return Item.value
}

func main() {
	pq := &PriorityQueue{}
	heap.Init(pq)
	pq.Enqueue("task1", 3)
	pq.Enqueue("task2", 1)
	pq.Enqueue("task3", 2)

	for _, v := range *pq {
		fmt.Println(v.value)
	}
}
